package com.ruben.features;

import java.util.List;
import java.util.stream.Stream;

/**
 * Stream新特性
 *
 * @author <achao1441470436@gmail.com>
 * @since 2021/7/18 17:27
 */
public class StreamDemo {
    public static void main(String[] args) {
        // @since 9：无限流现在可以给终止条件啦！注意第二个参数
        // @since 16：toList简化了.collect(Collectors.toList())
        // 这里是从0获取到99的元素
        List<Integer> collect = Stream.iterate(0, i -> i < 100, i -> ++i).toList();
        System.out.println("iterate&toList：" + collect);

        // @since 9：takeWhile——只要满足条件就取出元素，直到遇到第一个不满足的元素为止(不受并行流影响，属于有状态中间操作)
        System.out.print("takeWhile：");
        collect.parallelStream().takeWhile(i -> i < 66).forEach(obj -> System.out.print(obj + " "));
        System.out.println();

        // @since 9：dropWhile——只要满足条件就跳过，直到遇到第一个不满足条件的开始取值(不受并行流影响，属于有状态中间操作)
        List<Integer> drop = collect.parallelStream().dropWhile(i -> i < 66).toList();
        System.out.println("dropWhile" + drop);

        // @since 9：ofNullable，之前只有Stream.of，而Stream.of(null)会抛出NPE
        // ofNullable如果为空，则得到一个Stream.empty()
        Stream.ofNullable(null);
        Stream.of("");

        // @since 16：mapMulti——替换所有元素为...
        // BiConsumer中第一个参数是当前元素，第二个参数为Consumer，调用accept，传入要替换的值即可
        Stream.of("1", "2").mapMulti((a, b) -> b.accept(a + "0")).forEach(System.out::print);
        System.out.println();
        // 例如：元素全部累加1，这里mapMultiToInt是mapMulti变种，转换为基本类型int，下方同理
        Stream.of(1, 2).mapMultiToInt((a, b) -> b.accept(a + 1)).forEach(System.out::print);
        System.out.println();
        // 全部替换成8
        Stream.of("1", "2").mapMultiToLong((a, b) -> b.accept(8L)).forEach(System.out::print);
        System.out.println();
        // 全部减一
        Stream.of(1, 2).mapMultiToDouble((a, b) -> b.accept(a - 1)).forEach(obj -> System.out.print(obj + " "));

    }
}
